Use case: USART TX in DMA mode

Sequence diagram

USART transmit in DMA mode

@startuml
participant "User Application" as p1
participant "HAL USART driver" as p2
participant "USARTX_IRQHandler" as p5
participant "DMA" as p3
participant "DMAx_IRQHandler" as p4

== USART HAL Transmit DMA ==
p1->p2: <color: green> HAL_USART_Transmit_DMA(&husart, aTxBuffer, DATA_TO_SEND_SIZE)
note over p2 #00FF00
Transmitting data ongoing
end note
p2->p3: HAL_DMA_Start_IT()
p3-->p2: HAL_OK
p2-->p1: HAL_OK

p4<-: DMAx complete interrupt
p4->p3: HAL_DMA_IRQHandler
note over p3 #00FF00
End of transmitting data
end note
p3->p2: XferCpltCallback
p2->p2: Enable USARTx Transmit Complete IRQ (TCIE)
p5<-: USARTx Transmit Complete (TCIE)
p5->p2: HAL_USART_IRQHandler
p2->p1: HAL_USART_TxCpltCallback(&husart->TxXferCount)
@enduml

Code snippet

HAL1

HAL2

 #define DATA_TO_SEND_SIZE  255

uint8_t aTxBuffer[] = " **** USART_SlaveMode **** ";

 USART_HandleTypeDef husart;

 /* Ensure that all required peripherals
 (USART, GPIO, DMA, NVIC,etc.) are configured properly
 /*
 ...
 */

 /* USART register Transmit complete user callback */
 HAL_USART_RegisterCallback(&husart, HAL_USART_TX_CB_ID,
                               USART_TxCpltCallback);

 /* Start a USART Process in dma mode */
 HAL_USART_Transmit_DMA(&husart, aTxBuffer,
                               DATA_TO_SEND_SIZE)
 #define DATA_TO_SEND_SIZE  255

uint8_t aTxBuffer[] = " **** USART_SlaveMode **** ";

 hal_usart_handle_t husart;

 /* init and config for USART instance */
 /*
 ...
 */

 /* USART register Transmit complete user callback */
 HAL_USART_RegisterTxCpltCallback(&husart, USART_TxCpltCallback);



 /* Start a USART Process in dma mode */
 HAL_USART_Transmit_DMA(&husart, aTxBuffer,
                               DATA_TO_SEND_SIZE)

Key changes

  1. HAL2 DMA start uses HAL_DMA_StartPeriphXfer_IT_Opt() (optional interrupt generation) instead of HAL_DMA_Start_IT().

  2. HAL2 provides a dedicated registration API for TX completion callbacks: HAL_USART_RegisterTxCpltCallback().